package com.yangwudi.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

//<----------------------------------该部分为练习内容，与项目无关，可直接删除----------------------------------->

@Slf4j
//@Order(3)
//@Aspect
@Component
public class MyAspect5 {
    //切入点表达式
        //1.execution(访问修饰符？ 返回值 包名.类名？方法名（方法参数） throws 异常？)
            //其中带？的可以省略
                // 1.访问修饰符：可省略，比如：public、private、protected、default
                // 2.包名.类名：可省略，但是强烈建议不省略    -->在满足业务需求的前提下，尽量缩小切入点的匹配范围
                // 3.throws 异常：可省略
            //可以使用通配符描述切入点
                //1.    *：单个独立的任意符号。可以通配任意的返回值、包名、类名、方法名、任意类型的一个参数，
                 // 也可以通配包、类、方法名的一部分（com.yangwudi.service.impl.*.dele*(*)、 com.yangwudi.service.impl.*.*e(*) 等）
                //2.    ..：多个连续的任意符号，可以通配任意层级的包，或任意类型、任意个数的参数（* com..DeptService.*(..)）

        //2.@annotation(注解) --> @annotation(com.yangwudi.anno.LogOperation(全类名))
            //1.定义注解
            //2.使用注解 --> 在方法上使用
    @Pointcut("execution(* com.yangwudi.service.impl.*.*(..))")
    public void pt(){}

    //前置通知
    //根据业务需要，可以使用与（&&）、或（||）、非（！）来组合比较复杂的切入点表达式
//    @Before("execution(* com.yangwudi.service.impl.DeptServiceImpl.deleteById(..)) ||" +
//            " execution(* com.yangwudi.service.impl.DeptServiceImpl.add(..)) ")
    @Before("@annotation(com.yangwudi.anno.LogOperation)")
    public void before(){
        log.info("before ....");
    }


}
